package com.hbnu.system.utils;

import com.hbnu.system.config.BaseException;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * @Author: fyb
 * @DateTime: 2022/7/5 17:17
 **/
@Component
@Data
public class FileUploadUtil {

    @Value("${file.uploadPath}")
    private String uploadPath;

    @Value("${file.serverUrl}")
    private String serverUrl;

    private static final String UPLOAD_FILE = "/UploadFile";

    // 单文件上传 - 修复路径拼接问题
    public String uploadfile(String originalFilename, String fileType, MultipartFile file) throws IOException {
        // 确保fileType以斜杠开头，统一格式
        if (!fileType.startsWith("/")) {
            fileType = "/" + fileType;
        }

        // 处理文件类型路径，统一使用系统分隔符
        String fileTypePath = fileType.replace("/", File.separator);
        // 使用File构造器自动处理分隔符，避免手动拼接
        File filePath = new File(uploadPath, fileTypePath);

        // 创建目录（如果不存在）
        if (!filePath.exists()) {
            filePath.mkdirs();
        }

        // 生成带UUID前缀的文件名
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        String newFileName = uuid + originalFilename;

        // 保存文件
        File targetFile = new File(filePath, newFileName);
        file.transferTo(targetFile);

        // 返回URL时使用统一的正斜杠
        return UPLOAD_FILE + fileType + newFileName;
    }

    public boolean delete(String fileUrl) throws IOException {
        String uploadFileWithoutSlash = "UploadFile"; // 老数据格式

        // 先尝试查找配置的UPLOAD_FILE格式（带斜杠）
        int uploadFileIndex = fileUrl.indexOf(UPLOAD_FILE);

        // 如果找不到带斜杠的，再尝试查找不带斜杠的格式
        if (uploadFileIndex == -1) {
            uploadFileIndex = fileUrl.indexOf(uploadFileWithoutSlash);
        }

        if (uploadFileIndex == -1) {
            throw new BaseException("无效的文件URL: " + fileUrl);
        }

        // 根据找到的格式确定截取的起始位置
        int startIndex = uploadFileIndex + (fileUrl.charAt(uploadFileIndex) == '/' ? UPLOAD_FILE.length() : uploadFileWithoutSlash.length());
        String relativePath = fileUrl.substring(startIndex);

        // 移除可能存在的多余斜杠
        relativePath = relativePath.replaceAll("^/+", "");

        // 使用File构造器自动处理分隔符，避免手动拼接导致的重复
        File targetFile = new File(uploadPath, relativePath.replace("/", File.separator));
        Path targetFilePath = targetFile.toPath();

        if (Files.exists(targetFilePath)) {
            try {
                Files.delete(targetFilePath);
                return true;
            } catch (IOException e) {
                throw new BaseException("删除文件发生错误: " + e.getMessage());
            }
        } else {
            throw new BaseException("文件不存在");
        }
    }

    // 多文件上传 - 保持同样的路径处理逻辑
    public List<String> uploadfiles(MultipartFile files[]) throws IOException {
        List<String> names = new ArrayList<>();
        for (MultipartFile file : files) {
            String originalFilename = file.getOriginalFilename();
            if (originalFilename == null || originalFilename.isEmpty()) {
                continue;
            }

            String uuid = UUID.randomUUID().toString().replaceAll("-", "");
            String newFileName = uuid + originalFilename;
            // 使用File构造器处理路径
            File targetFile = new File(uploadPath, newFileName);

            // 创建目录（如果不存在）
            File dir = targetFile.getParentFile();
            if (!dir.exists()) {
                dir.mkdirs();
            }

            file.transferTo(targetFile);
            names.add(serverUrl + UPLOAD_FILE + "/" + newFileName);
        }
        return names;
    }

//    //单文件上传
//    public String uploadfile(String originalFilename,String fileType, MultipartFile file) throws IOException {
//        //将fileType的/换成\
//        String fileTypePath = fileType.replace("/", "\\");
//        //C:\www\nginx-1.22.0\html\UploadFile\Paper\
//        String filePath = uploadPath+fileTypePath;
//        //新的文件名字
//        String newFileName = UUID.randomUUID().toString().replaceAll("-", "") + originalFilename;
//        //封装上传文件位置的全路径  C:\www\nginx-1.22.0\html\UploadFile\Paper\+文件名
//        File targetFile = new File(filePath, newFileName);
//        //把本地文件上传到封装上传文件位置的全路径
//        file.transferTo(targetFile);
//
//        return serverUrl + UPLOAD_FILE+fileType+ newFileName;
//
//    }
//
//    public boolean delete(String filePath) throws IOException {
//        //将filePath的/换成\，只截取UploadFile后面的部分
//        filePath = filePath.replace("/", "\\");
//        filePath = filePath.substring(filePath.indexOf("UploadFile") + 10);
///*        String FileName = filePath.substring(filePath.lastIndexOf("/") + 1);
//        File targetFile = new File(filePath, FileName);*/
//        //封装删除文件位置的全路径  C:\www\nginx-1.22.0\html\UploadFile\Paper\+文件名
//        String targetPath = uploadPath + filePath;
//        System.out.println("targetPath="+targetPath);
//        System.out.println("filePath="+filePath);
//        Path targetFilePath = Paths.get(targetPath);
//        if (Files.exists(targetFilePath)) {
//            try {
//                Files.delete(targetFilePath);
//            } catch (IOException e) {
//                throw new BaseException("删除文件发生错误");
//            }
//        } else {
//            throw new BaseException("文件路径问题");
//        }
//        return true;
//    }
//
//
//    //多文件上传
//    public List<String> uploadfiles(MultipartFile files[]) throws IOException {
//
//        String filePath = uploadPath;
//        List<String> names = new ArrayList<>();
//        for (MultipartFile file : files) {
//            String originalFilename = file.getOriginalFilename();
//            //获取原始图片的拓展名
//            //新的文件名字
//            String newFileName = UUID.randomUUID().toString().replaceAll("-", "") + originalFilename;
//            //封装上传文件位置的全路径
//            File targetFile = new File(filePath, newFileName);
//
//            //把本地文件上传到封装上传文件位置的全路径
//            file.transferTo(targetFile);
//            //服务器上传的地址
//            names.add(serverUrl + UPLOAD_FILE + newFileName);
//            //本地上传的地址要在  D盘创建一个images文件夹
//
//        }
//        return names;
//
//    }



}
